package com.zhentao.util;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.UUID;

/**
 * MD5密码加密工具类
 */
@Component
@Slf4j
public class MD5PasswordUtil {

    /**
     * 生成随机盐值
     * 
     * @return 32位随机盐值字符串
     */
    public String generateSalt() {
        // 使用UUID生成32位随机盐值，与项目现有模式保持一致
        return UUID.randomUUID().toString().replace("-", "");
    }

    /**
     * 使用MD5加密密码
     * 
     * @param password 明文密码
     * @param salt 盐值
     * @return MD5加密后的密码（32位小写十六进制字符串）
     */
    public String encryptPassword(String password, String salt) {
        if (password == null || salt == null) {
            throw new IllegalArgumentException("密码和盐值不能为空");
        }

        try {
            // 将密码和盐值组合
            String passwordWithSalt = password + salt;
            
            // 获取MD5实例
            MessageDigest md = MessageDigest.getInstance("MD5");
            
            // 加密
            byte[] digest = md.digest(passwordWithSalt.getBytes("UTF-8"));
            
            // 转换为32位小写十六进制字符串
            StringBuilder hexString = new StringBuilder();
            for (byte b : digest) {
                String hex = Integer.toHexString(0xff & b);
                if (hex.length() == 1) {
                    hexString.append('0');
                }
                hexString.append(hex);
            }
            
            return hexString.toString();
            
        } catch (NoSuchAlgorithmException | java.io.UnsupportedEncodingException e) {
            log.error("MD5密码加密失败", e);
            throw new RuntimeException("密码加密失败", e);
        }
    }

    /**
     * 验证密码
     * 
     * @param plainPassword 明文密码
     * @param hashedPassword 已加密的密码
     * @param salt 盐值
     * @return 密码是否匹配
     */
    public boolean verifyPassword(String plainPassword, String hashedPassword, String salt) {
        if (plainPassword == null || hashedPassword == null || salt == null) {
            return false;
        }

        try {
            // 重新加密输入的明文密码
            String encryptedInput = encryptPassword(plainPassword, salt);
            
            // 与存储的密码进行对比
            return encryptedInput.equals(hashedPassword);
            
        } catch (Exception e) {
            log.error("密码验证失败", e);
            return false;
        }
    }
}
